package com.example.lib_base.utils;


import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import kotlin.random.Random;

/**
 * 按几率产生随机数
 * 例如，产生0.1-100的随机数，0.1-1的几率是90%，1-10的几率是9%，10-100的几率是1%
 *
 * 插值separates为 1 10 四段的概率如上
 */
public class RandomNumberForRate {

    /**
     * 产生随机数
     * @param min 最小值
     * @param max 最大值
     * @return 随机结果
     */
    public static double produceRandomNumber(double min,double max){
        return  Random.Default.nextDouble(min, max); //[min,max]
    }

    /**
     * 按比率产生随机数
     * @param min 最小值
     * @param max 最大值
     * @param separates 分割值（中间插入数）
     * @param percents 每段数值的占比（几率） 加起来100  如三份 90 9 1
     * @return 按比率随机结果
     */
    public static double produceRateRandomNumber(double min, double max, List<Double> separates, List<Float> percents){
        if(min > max){
            throw new IllegalArgumentException("min值必须小于max值");
        }
        if(separates == null || percents==null || separates.size()==0){
            return produceRandomNumber(min,max);
        }
        if(separates.size() +1 != percents.size()){
            throw new IllegalArgumentException("分割数字的个数加1必须等于百分比个数");
        }
        float totalPercent = 0;
        for(Float p:percents){
            if(p<0f || p>1f){
                throw  new IllegalArgumentException("百分比必须在[0,1]之间");
            }
            totalPercent += p;
        }
        if(totalPercent != 1f){
            throw new IllegalArgumentException("百分比之和必须为1");
        }
        for(double s:separates){
            if(s <= min || s >= max){
                throw new IllegalArgumentException("分割数值必须在(min,max)之间");
            }
        }
        int rangeCount = separates.size()+1; //例如：3个插值，可以将一个数值范围分割成4段
        //构造分割的n段范围
        List<Range> ranges = new ArrayList<Range>();
        float scopeMax = 0f;
        for(int i=0;i<rangeCount;i++){
            Range range = new Range();
            range.min = (i==0 ? min:separates.get(i-1));
            range.max = (i== rangeCount-1 ?max:separates.get(i));
            range.percent = percents.get(i);

            //片段占比，转换为[1,100]区间的数字
            range.percentScopeMin = scopeMax ;
            range.percentScopeMax = range.percentScopeMin + (range.percent);
            scopeMax = range.percentScopeMax;

            ranges.add(range);
        }
        //结果赋初值
        double r = min;
        float randomInt = (float) (Math.random()*1);
        for(int i=0;i<ranges.size();i++){
            Range range = ranges.get(i);
            if (i != ranges.size()-1){
                if(range.percentScopeMin <= randomInt && randomInt < range.percentScopeMax){
                    r = produceRandomNumber(range.min,range.max);
                    break;
                }
            }else {
                if(range.percentScopeMin < randomInt && randomInt <= range.percentScopeMax){
                    r = produceRandomNumber(range.min,range.max);
                    break;
                }
            }
        }
        return r;
    }

    public static class Range{
        public double min;
        public double max;
        public Float percent; //百分比

        public Float percentScopeMin;
        public Float percentScopeMax;
    }
}
